package com.wyl.paramReceive.controller;

import com.alibaba.fastjson.JSON;
import com.wyl.paramReceive.dto.PersonDto;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * springmvc接收各种格式的参数demo
 *
 * @author 吴宇亮 on 2023/4/27 9:23
 */
@RestController
@RequestMapping("/paramReceive")
public class ParamReceiveController {

    // 请求头
    // 修饰String接收单个请求头信息
    // 修饰Map获取所有请求头信息
    @GetMapping("/header")
    public String header(@RequestHeader("User-Agent") String userAgent, @RequestHeader Map<String, String> headers) {
        System.out.println(userAgent);
        return JSON.toJSONString(headers);
    }

    /// get请求，url后的参数
    @GetMapping("/getParam")
    public String getParam(@RequestParam String param) {
        return param;
    }

    /// post请求
    // post + url参数
    @PostMapping("/postParam")
    public String postParam(@RequestParam String param) {
        return param;
    }

    // form-data
    // 同时接收对象和文件，示例1
    @PostMapping("/postFormDataAndFile1")
    public String postFormDataAndFile1(
            // 接收formData不能使用@RequestBody接收
            /*@RequestBody*/ PersonDto person
            , @RequestParam(value = "file1", required = false) MultipartFile file1
            , @RequestParam(value = "file2", required = false) MultipartFile file2) {
        return JSON.toJSONString(person);
    }

    // 同时接收对象和文件，示例2
    @PostMapping("/postFormDataAndFile2")
    public String postFormDataAndFile2(PersonDto person
            , @RequestParam(value = "files", required = false) List<MultipartFile> files) {
        return JSON.toJSONString(person);
    }

    // 同时接收对象和文件，示例3
    @PostMapping("/postFormDataAndFile3")
    public String postFormDataAndFile2(
            @RequestParam(value = "name", required = false) String name,
            @RequestParam(value = "school.name", required = false) String schoolName,
            @RequestParam(value = "files", required = false) List<MultipartFile> files) {
        return "ok";
    }

    // x-www-form-urlencoded参数的接收方式跟form-data一样，只是x-www-form-urlencoded不能传文件
//    x-www-form-urlencoded和form-data是两种常用的HTTP请求数据格式，它们之间有以下区别：
//    x-www-form-urlencoded是将数据编码为键值对，数据在发送请求时放在HTTP请求体中，并使用&符号分割键值对。这种格式通常用于发送简单的表单数据，例如登录表单的用户名和密码。
//    form-data也是将数据编码为键值对，但与x-www-form-urlencoded不同的是，数据被视为一系列“部分”（part），每个部分都有自己的Content-Type，并且其二进制数据直接作为HTTP请求体的一部分发送，而不是被编码为文本。这种格式通常用于上传文件或大型二进制数据。
//    因此，当您需要上传文件或其他二进制数据时，应该使用form-data格式，而对于简单的表单数据，可以使用x-www-form-urlencoded格式。

    // raw（text、JavaScript、json、html、xml）
    @PostMapping("/postParamAndJson")
    public String postParamAndJson(@RequestParam(required = false) String param, @RequestBody PersonDto person) {
        return JSON.toJSONString(person);
    }

    // binary
    @PostMapping("/binary")
    public String binary(@RequestBody byte[] file) {
        return "ok";
    }

}
